package com.liyu.rabbit;

import com.liyu.rabbit.factory.RabbitFactory;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;

/**
 * 作者: 李誉
 * 时间: 2022-01-13 19:49
 * 描述: 消息生产者
 */
public class Producer {

    // 队列名称
    public static final String QUEUE_NAME = "hello";
    public static final String QUEUE_NAME2 = "hello2";

    // 交换机名称
    public static final String EXCHANGE_NAME = "ex_hello";

    // 发送消息
    public static void main(String[] args) throws IOException, TimeoutException {
        // 获得信道
        Channel channel = RabbitFactory.createNewChannel();

        /*
         * 创建一个队列
         * 参数：
         *  queue：队列名称
         *  durable：是否持久化(默认存储在内存中)
         *  exclusive：是否是一个独占队列（一般等于true的话用于一个队列只能有一个消费者来消费的场景）
         *          有两个作用，一：当连接关闭时connection.close()该队列是否会自动删除；二：该队列是否是私有的private，
         *          如果不是排外的，可以使用两个消费者都访问同一个队列，没有任何问题，如果是排外的，会对当前队列加锁，其他通
         *          道channel是不能访问的，如果强制访问会报异常
         * autoDelete：是否自动删除，当最后一个消费者断开连接之后队列是否自动被删除
         * arguments：其他参数
         */
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        channel.queueDeclare(QUEUE_NAME2,true, false, false, null);

        // 绑定交接机-路由-消息队列
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "rk_" +QUEUE_NAME);
        channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, "rk_" +QUEUE_NAME2);

        // 设置交换机和交换机类型
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            // 初始化发送的消息
            String msg = scanner.next();
            // 发送消息 这里要设置交换机名称，但是不设置路由
            // MessageProperties.PERSISTENT_TEXT_PLAIN：表示持久化
            channel.basicPublish(EXCHANGE_NAME,"", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes(StandardCharsets.UTF_8));
        }
        System.out.println("成功启动生产者线程。。。。");

    }

}
